import 'package:flutter/cupertino.dart';
import 'package:xindong/models/user/xindong_base_user.dart';
import 'package:xindong/utils/xindong_text_util.dart';
import 'package:xindong/widgets/animation/xindong_animation_svga.dart';

/// SVGA类型
enum SVGAType {
  none,
  receiveGift,
}

/// SVGA显示模型
class SVGAClass {
  SVGAType? type;
  String svga;
  String? name;
  bool allowDuplicates; //允许重复
  XinDongBaseUser? owner;
  XinDongBaseUser? target;

  SVGAClass({this.type, this.name, required this.svga, this.allowDuplicates = true, this.owner, this.target});

  @override
  String toString() {
    return 'SVGAClass{type: $type, name: $name, svga: $svga, owner: $owner, target: $target}';
  }
}

/// 自定义回调方法
typedef SVGACallBack = void Function(SVGAClass model, XinDongAnimationSVGA animationSVGA);

/// SVGA队列
class XinDongSVGAQueue {
  final BoxFit fit;

  // 有队列开始时回调
  final SVGACallBack onStart;

  // 有队列结束时回调
  final Function() onEnd;

  // 排队【等待队列】
  List<SVGAClass> awaitList = [];
  bool isRun = false;

  /// 构造函数
  XinDongSVGAQueue({required this.onStart, required this.onEnd, this.fit = BoxFit.contain});

  /// 清除
  void clear() {
    awaitList.clear();
    isRun = false;
    onEnd();
  }

  /// 添加方法
  void addQueue(SVGAClass? object) {
    // 格式不匹配
    if (object == null || TextUtil.isEmpty(object.svga)) {
      return;
    }
    // 不允许重复
    if (object.allowDuplicates == false) {
      if (isRun) {
        return;
      }
      if (awaitList.any((element) => element.svga == object.svga)) {
        return;
      }
    }
    // 对象先排队到【等待队列】
    awaitList.add(object);
    // 不需等待，取出数据进入到【进行队列】先进先出
    if (isRun) {
      return;
    }
    isRun = true;
    // 可以到【进行队列】
    createSVGA();
  }

  /// 开始SVGA动画，一个个来
  void createSVGA() {
    SVGAClass first = awaitList.first;
    awaitList.remove(first);
    // 回调
    onStart(
      first,
      XinDongAnimationSVGA(
        url: first.svga,
        fit: fit,
        onPlayEnd: () {
          if (awaitList.isNotEmpty) {
            // 递归
            createSVGA();
          } else {
            isRun = false;
            onEnd();
          }
        },
      ),
    );
  }
}
